Examining the 2014 Seattle and San Francisco summer crime data, as reported by the police, I noticed that San Francisco, despite having a population of less than 30 percent greater than the population of Seattle, had more than twice as many recorded cases of drug crime. Does this reflect a greater rate of use of certain drugs in San Francisco than in Seattle, or, rather, perhaps a difference in the manner of enforcement of drug laws or the manner in which reported infractions are recorded? Digging somewhat deeper—examining the data from 2013 through 2017 and on the use of certain popular drugs—I uncovered some striking trends and obtained some possible insight into these questions.
Examining the Seattle crime data from 2013 through 2017, one of the first things I noticed was a dramatic increase in the number of incidences of crime reflected in the police data. As the following plot of incidences of crime within some selected categories shows, the fractional increase in incidences of crime in the data is roughly the same across the various categories of crime.

San Francisco has seen no such increase. Furthermore, there is no evidence of the massive crime wave in Seattle that this data would suggest, if the increase were taken to reflect the actual increase in crime. For example, there are reports of recent increases of use of some drugs, particularly heroin, but nothing close to the more than 100 percent increase in use, from one year to the next, that the data on drug crime in Seattle might seem to suggest.
Looking somewhat deeper at the recorded cases of illegal drug use in the two cities, let’s consider the differences between crimes that would be considered trafficking and those that would be considered possession.
seattle_drugs_13_17 <- seattle_drugs_13_17 %>%
mutate(`Drug Type` = ifelse(str_detect(`Offense Type`, "MARIJU"), "Marijuana", #yes
ifelse(str_detect(`Offense Type`, "METH"), "Methamphetamine", #yes
ifelse(str_detect(`Offense Type`, "COCAINE"), "Cocaine", #yes
ifelse(str_detect(`Offense Type`, "HEROIN"), "Heroin", #yes
ifelse(str_detect(`Offense Type`, "PRESCRIPTION"), "Prescription", #?
ifelse(str_detect(`Offense Type`, "PILL/TABLET"), "Pill/Tablet", #?
ifelse(str_detect(`Offense Type`, "HALLUCINOGEN"), "Hallucinogen",
ifelse(str_detect(`Offense Type`, "SYNTHETIC"), "Synthetic", #?
ifelse(str_detect(`Offense Type`, "AMPHETAMINE"), "Amphetamine", #yes
ifelse(str_detect(`Offense Type`, "OPIUM"), "Opium", #yes
ifelse(str_detect(`Offense Type`, "PARAPHENALIA"), "Paraphernalia", #yes
"Other")
)))))))))))
SF_drugs_13_17 <- SF_drugs_13_17 %>%
mutate(`Drug Type` = ifelse(str_detect(Descript, "MARIJUANA"), "Marijuana", #yes
ifelse(str_detect(Descript, "COCAINE"), "Cocaine",
ifelse(str_detect(Descript, "METH-AMPHETAMINE"), "Methamphetamine",
ifelse(str_detect(Descript, "BARBITUATES"), "Barbituates",
ifelse(str_detect(Descript, "CONTROLLED SUBSTANCE"),
"Controlled Substance",
ifelse(str_detect(Descript, "HALLUCINOGENIC"), "Hallucinogenic",
ifelse(str_detect(Descript, "AMPHETAMINE"), "Amphetamine",
ifelse(str_detect(Descript, "METHADONE"), "Methadone",
ifelse(str_detect(Descript, "PARAPHERNALIA"), "Paraphernalia",
ifelse(str_detect(Descript, "OPIATES"), "Opiates",
ifelse(str_detect(Descript, "OPIUM"), "Opium",
ifelse(str_detect(Descript, "HEROIN"), "Heroin",
"Other")
))))))))))))
ggplot(SF_drugs_13_17) +
geom_bar(aes(`Drug Type`)) +
labs(title = "San Francisco") +
theme(axis.text.x = element_text(angle = 75, hjust = 1, vjust = 1))
seattle_selected_drugs <- seattle_drugs_13_17 %>%
filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))
SF_selected_drugs <- SF_drugs_13_17 %>%
filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))
ggplot(seattle_selected_drugs) +
geom_bar(aes(`Drug Type`)) +
labs(title = "Seattle") +
theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1))
ggplot(SF_selected_drugs) +
geom_bar(aes(`Drug Type`)) +
labs(title = "San Francisco") +
theme(axis.text.x = element_text(angle = 75, hjust = 1, vjust = 1))
joined_drug_counts <- (seattle_selected_drugs %>% count(Year, `Drug Type`)) %>%
left_join((SF_selected_drugs %>% count(Year, `Drug Type`)), by = c("Year", "Drug Type"))
joined_drug_counts <- joined_drug_counts %>%
rename(Seattle = n.x, `San Francisco` = n.y) %>%
gather(Seattle, `San Francisco`, key = City, value = count)
plt <- ggplot(joined_drug_counts) + geom_col(aes(x = Year, y = count, fill = City, color = `Drug Type`),
position = "dodge")
ggplotly(plt) %>% layout(margin = list(b = 50, l = 60, r = 10, t = 80))
library(lubridate)
library(gridExtra)
#fig.height = 2, fig.width = 3
#seattle_drugs_13_17 <- seattle_drugs_13_17 %>%
# mutate(R_date = floor_date(mdy_hms(`Occurred Date or Date Range Start`,
# tz = "PST8PDT"), "day"))
#SF_drugs_13_17 <- SF_drugs_13_17 %>%
# mutate(R_date = mdy(Date, tz = "PST8PDT"))
seattle_selected_drugs <- seattle_drugs_13_17 %>%
filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))
SF_selected_drugs <- SF_drugs_13_17 %>%
filter(`Drug Type` %in% c("Marijuana", "Cocaine", "Methamphetamine", "Heroin"))
number_of_bins <- 78
plt_seattle_selected_drugs <- ggplot(seattle_selected_drugs) +
geom_freqpoly(aes(x = R_date, color = `Drug Type`), bins = number_of_bins) +
scale_x_datetime(date_breaks = "4 months",
limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"),
as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
labs(y = "number per fortnight", x = "",
title = "Seattle Police Incidents Related to 4 Popular Drugs",
color = "Drug: ") +
theme(legend.position = "bottom",
plot.title = element_text(size = 9),
axis.title.y = element_text(size = 8),
axis.text.x = element_text(size = 6),
legend.text = element_text(size = 6),
legend.title = element_text(size = 8)) +
guides(size = guide_legend(order = 2))
plt_SF_selected_drugs <- ggplot(SF_selected_drugs) +
geom_freqpoly(aes(x = R_date, color = `Drug Type`), bins = number_of_bins) +
scale_x_datetime(date_breaks = "4 months",
limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"),
as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
labs(y = "number per fortnight", x = "",
title = "San Francisco Police Incidents Related to 4 Popular Drugs") +
theme(legend.position = "none",
plot.title = element_text(size = 9),
axis.title.y = element_text(size = 8),
axis.text.x = element_text(size = 6))
plt_seattle_all_13_17 <- seattle_complete %>%
filter(Year %in% 2013:2017) %>%
ggplot(aes(x = R_date)) + geom_freqpoly(bins = number_of_bins) +
scale_x_datetime(date_breaks = "4 months",
limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"),
as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
labs(y = "number per fortnight", x = "",
title = "Seattle Police Incidents: 2013 through 2017") +
theme(plot.title = element_text(size = 9),
axis.title.y = element_text(size = 8),
axis.text.x = element_text(size = 6))
plt_SF_all_13_17 <- SF_complete %>%
filter(Year %in% 2013:2017) %>%
ggplot(aes(x = R_date)) + geom_freqpoly(bins = number_of_bins) +
scale_x_datetime(date_breaks = "4 months",
limits = c(as.POSIXct("2012/12/31", tz = "PST8PDT"),
as.POSIXct("2018/01/01", tz = "PST8PDT"))) +
theme(axis.text.x = element_text(angle = 65, hjust = 1, vjust = 1)) +
labs(y = "number per fortnight", x = "",
title = "San Francisco Police Incidents: 2013 through 2017") +
theme(plot.title = element_text(size = 9),
axis.title.y = element_text(size = 8),
axis.text.x = element_text(size = 6))
grid.arrange(plt_seattle_all_13_17, plt_SF_all_13_17,
plt_SF_selected_drugs, plt_seattle_selected_drugs,
layout_matrix = rbind(c(1, 2),
c(4, 3),
c(4, NA)),
heights = c(5, 5, 1))

NA
LS0tCnRpdGxlOiAiRHJ1Z3MgYW5kIHRoZSBQb2xpY2U6IFNhbiBGcmFuY2lzY28gYW5kIFNlYXR0bGUiCmF1dGhvcjogIlN0dWFydCBCYXJudW0iCm91dHB1dDogaHRtbF9ub3RlYm9vawpkYXRlOiAyLzEyLzIwMTgKLS0tCgpFeGFtaW5pbmcgdGhlIDIwMTQgU2VhdHRsZSBhbmQgU2FuIEZyYW5jaXNjbyBzdW1tZXIgY3JpbWUgZGF0YSwgYXMgcmVwb3J0ZWQgYnkgdGhlIHBvbGljZSwgSSBub3RpY2VkIHRoYXQgU2FuIEZyYW5jaXNjbywgZGVzcGl0ZSBoYXZpbmcgYSBwb3B1bGF0aW9uIG9mIGxlc3MgdGhhbiAzMCBwZXJjZW50IGdyZWF0ZXIgdGhhbiB0aGUgcG9wdWxhdGlvbiBvZiBTZWF0dGxlLCBoYWQgbW9yZSB0aGFuIHR3aWNlIGFzIG1hbnkgcmVjb3JkZWQgY2FzZXMgb2YgZHJ1ZyBjcmltZS4gRG9lcyB0aGlzIHJlZmxlY3QgYSBncmVhdGVyIHJhdGUgb2YgdXNlIG9mIGNlcnRhaW4gZHJ1Z3MgaW4gU2FuIEZyYW5jaXNjbyB0aGFuIGluIFNlYXR0bGUsIG9yLCByYXRoZXIsIHBlcmhhcHMgYSBkaWZmZXJlbmNlIGluIHRoZSBtYW5uZXIgb2YgZW5mb3JjZW1lbnQgb2YgZHJ1ZyBsYXdzIG9yIHRoZSBtYW5uZXIgaW4gd2hpY2ggcmVwb3J0ZWQgaW5mcmFjdGlvbnMgYXJlIHJlY29yZGVkPyBEaWdnaW5nIHNvbWV3aGF0IGRlZXBlci0tLWV4YW1pbmluZyB0aGUgZGF0YSBmcm9tIDIwMTMgdGhyb3VnaCAyMDE3IGFuZCBvbiB0aGUgdXNlIG9mIGNlcnRhaW4gcG9wdWxhciBkcnVncy0tLUkgdW5jb3ZlcmVkIHNvbWUgc3RyaWtpbmcgdHJlbmRzIGFuZCBvYnRhaW5lZCBzb21lIHBvc3NpYmxlIGluc2lnaHQgaW50byB0aGVzZSBxdWVzdGlvbnMuCgpFeGFtaW5pbmcgdGhlIFNlYXR0bGUgY3JpbWUgZGF0YSBmcm9tIDIwMTMgdGhyb3VnaCAyMDE3LCBvbmUgb2YgdGhlIGZpcnN0IHRoaW5ncyBJIG5vdGljZWQgd2FzIGEgZHJhbWF0aWMgaW5jcmVhc2UgaW4gdGhlIG51bWJlciBvZiBpbmNpZGVuY2VzIG9mIGNyaW1lIHJlZmxlY3RlZCBpbiB0aGUgcG9saWNlIGRhdGEuIEFzIHRoZSBmb2xsb3dpbmcgcGxvdCBvZiBpbmNpZGVuY2VzIG9mIGNyaW1lIHdpdGhpbiBzb21lIHNlbGVjdGVkIGNhdGVnb3JpZXMgc2hvd3MsIHRoZSBmcmFjdGlvbmFsIGluY3JlYXNlIGluIGluY2lkZW5jZXMgb2YgY3JpbWUgaW4gdGhlIGRhdGEgaXMgcm91Z2hseSB0aGUgc2FtZSBhY3Jvc3MgdGhlIHZhcmlvdXMgY2F0ZWdvcmllcyBvZiBjcmltZS4KCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShwbG90bHkpCmxpYnJhcnkobHVicmlkYXRlKQoKU0ZfY29tcGxldGUgPC0gcmVhZF9jc3YoIlNGX0NvbXBsZXRlLmNzdiIpCnNlYXR0bGVfY29tcGxldGUgPC0gcmVhZF9jc3YoInNlYXR0bGVfY29tcGxldGUuY3N2IiwgZ3Vlc3NfbWF4ID0gMTAwMDAwKQojV2l0aCBndWVzcyBtYXggbGFyZ2UgZW5vdWdoLCBjb2x1bW5zIHRoYXQgY29udGFpbiBpbnRlZ2VycyB0aGF0IGV4Y2VlZCB0aGUgCiMzMi1iaXQgbWF4aW11bSBhcmUgcmVhZCBhcyBjaGFyYWN0ZXIgdmVjdG9ycy4KClNGX2NvbXBsZXRlIDwtIFNGX2NvbXBsZXRlICU+JQogIG11dGF0ZShZZWFyID0gYXMuaW50ZWdlcihzdHJfc3ViKERhdGUsIC00LCAtMSkpKSAlPiUKICBtdXRhdGUoQ2F0ZWdvcnkgPSBmY3RfcmVjb2RlKENhdGVnb3J5LAogICAgICAgICJEcnVncyIgPSAiRFJVRy9OQVJDT1RJQyIpKQoKc2VhdHRsZV9jb21wbGV0ZSA8LSBzZWF0dGxlX2NvbXBsZXRlICU+JQogIHJlbmFtZShDYXRlZ29yeSA9IGBTdW1tYXJpemVkIE9mZmVuc2UgRGVzY3JpcHRpb25gKSAlPiUKICBtdXRhdGUoQ2F0ZWdvcnkgPSBmY3RfcmVjb2RlKENhdGVnb3J5LAogICAgICAgICJQcm9zdGl0dXRpb24iID0gIlBST1NUSVRVVElPTiIsCiAgICAgICAgIkRydWdzIiA9ICJOQVJDT1RJQ1MiLAogICAgICAgICJXZWFwb25zIiA9ICJXRUFQT04iLAogICAgICAgICJMaXF1b3Jcbmxhd3MiID0gIkxJUVVPUiBWSU9MQVRJT04iLAogICAgICAgICJBc3NhdWx0IiA9ICJBU1NBVUxUIiwKICAgICAgICAiSG9taWNpZGUiID0gIkhPTUlDSURFIiwKICAgICAgICAiUm9iYmVyeSIgPSAiUk9CQkVSWSIsCiAgICAgICAgIlZlaGljbGVcbnRoZWZ0IiA9ICJWRUhJQ0xFIFRIRUZUIiwKICAgICAgICAiVGhlZnRcbmZyb21cbnZlaGljbGUiID0gIkNBUiBQUk9XTCIpKQoKc2VhdHRsZV9jb21wbGV0ZSA8LSBzZWF0dGxlX2NvbXBsZXRlICU+JQogIG11dGF0ZShSX2RhdGUgPSBmbG9vcl9kYXRlKG1keV9obXMoYE9jY3VycmVkIERhdGUgb3IgRGF0ZSBSYW5nZSBTdGFydGAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eiA9ICJQU1Q4UERUIiksICJkYXkiKSkKClNGX2NvbXBsZXRlIDwtIFNGX2NvbXBsZXRlICU+JQogIG11dGF0ZShSX2RhdGUgPSBtZHkoRGF0ZSwgdHogPSAiUFNUOFBEVCIpKQoKCnNlYXR0bGVfY29tcGxldGUgJT4lCiAgZmlsdGVyKENhdGVnb3J5ICVpbiUgCiAgICAgICAgYygiUHJvc3RpdHV0aW9uIiwKICAgICAgICAiRHJ1Z3MiLAogICAgICAgICJXZWFwb25zIiwKICAgICAgICAiQXNzYXVsdCIsCiAgICAgICAgIkhvbWljaWRlIiwKICAgICAgICAiUm9iYmVyeSIsCiAgICAgICAgIlZlaGljbGVcbnRoZWZ0IiwKICAgICAgICAiVGhlZnRcbmZyb21cbnZlaGljbGUiKSkgJT4lCiAgZmlsdGVyKFllYXIgJWluJSAyMDEzOjIwMTcpICU+JQogIGdncGxvdChhZXMoeCA9IENhdGVnb3J5LCBmaWxsID0gYXMuZmFjdG9yKFllYXIpKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIikgKwogIGdndGl0bGUoIlJlY29yZGVkIENhc2VzIG9mIFNlbGVjdGVkIENhdGVnb3JpZXMgb2YgQ3JpbWU6IFNlYXR0bGUiKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsKICBsYWJzKGZpbGwgPSAiWWVhciIpCgpgYGAKU2FuIEZyYW5jaXNjbyBoYXMgc2VlbiBubyBzdWNoIGluY3JlYXNlLiBGdXJ0aGVybW9yZSwgdGhlcmUgaXMgbm8gZXZpZGVuY2Ugb2YgdGhlIG1hc3NpdmUgY3JpbWUgd2F2ZSBpbiBTZWF0dGxlIHRoYXQgdGhpcyBkYXRhIHdvdWxkIHN1Z2dlc3QsIGlmIHRoZSBpbmNyZWFzZSB3ZXJlIHRha2VuIHRvIHJlZmxlY3QgdGhlIGFjdHVhbCBpbmNyZWFzZSBpbiBjcmltZS4gRm9yIGV4YW1wbGUsIHRoZXJlIGFyZSByZXBvcnRzIG9mIHJlY2VudCBpbmNyZWFzZXMgb2YgdXNlIG9mIHNvbWUgZHJ1Z3MsIHBhcnRpY3VsYXJseSBoZXJvaW4sIGJ1dCBub3RoaW5nIGNsb3NlIHRvIHRoZSBtb3JlIHRoYW4gMTAwIHBlcmNlbnQgaW5jcmVhc2UgaW4gdXNlLCBmcm9tIG9uZSB5ZWFyIHRvIHRoZSBuZXh0LCB0aGF0IHRoZSBkYXRhIG9uIGRydWcgY3JpbWUgaW4gU2VhdHRsZSBtaWdodCBzZWVtIHRvIHN1Z2dlc3QuIAoKTG9va2luZyBzb21ld2hhdCBkZWVwZXIgYXQgdGhlIHJlY29yZGVkIGNhc2VzIG9mIGlsbGVnYWwgZHJ1ZyB1c2UgaW4gdGhlIHR3byBjaXRpZXMsIGxldCdzIGNvbnNpZGVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGNyaW1lcyB0aGF0IHdvdWxkIGJlIGNvbnNpZGVyZWQgdHJhZmZpY2tpbmcgYW5kIHRob3NlIHRoYXQgd291bGQgYmUgY29uc2lkZXJlZCBwb3NzZXNzaW9uLgoKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gNSwgZmlnLndpZHRoID0gMTB9CmxpYnJhcnkoc3RyaW5ncikKCnNlYXR0bGVfZHJ1Z3NfMTNfMTcgPC0gc2VhdHRsZV9jb21wbGV0ZSAlPiUKICBmaWx0ZXIoQ2F0ZWdvcnkgPT0gIkRydWdzIiAmIFllYXIgJWluJSBjKDIwMTM6MjAxNykpCgpTRl9kcnVnc18xM18xNyA8LSBTRl9jb21wbGV0ZSAlPiUKICBtdXRhdGUoYENpdGVkIG9yIEFycmVzdGVkYCA9IChzdHJfZGV0ZWN0KFJlc29sdXRpb24sICJBUlJFU1QiKSB8IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoUmVzb2x1dGlvbiwgIkNJVEVEIikpKSAlPiUKICBmaWx0ZXIoQ2F0ZWdvcnkgPT0gIkRydWdzIiAmIFllYXIgJWluJSBjKDIwMTM6MjAxNykpCgpTRl9kcnVnc18xM18xNyA8LSBTRl9kcnVnc18xM18xNyAlPiUgCiAgbXV0YXRlKGBEcnVnIE9mZmVuc2UgVHlwZWAgPSAKICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiTEFCIEFQUEFSQVRVUyIpLCAiU2FsZXMsIFRyYW5zcG9ydGF0aW9uLCBvciBQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIlBPU1NFU1NJT04iKSwgIlBvc3Nlc3Npb24iLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiU0FMRSIpLCAiU2FsZXMsIFRyYW5zcG9ydGF0aW9uLCBvciBQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIlRSQU5TUE9SVCIpLCAiU2FsZXMsIFRyYW5zcG9ydGF0aW9uLCBvciBQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIlBMQU5USU5HL0NVTFRJVkFUSU5HIE1BUklKVUFOQSIpLCAKICAgICAgICAgICAgICAgICAgICAgIlNhbGVzLCBUcmFuc3BvcnRhdGlvbiwgb3IgUHJvZHVjdGlvbiIsCiAgICAgICAgICAgICAgIk90aGVyIgogICAgICAgICAgICAgICkpKSkpKQoKc2VhdHRsZV9kcnVnc18xM18xNyA8LSBzZWF0dGxlX2RydWdzXzEzXzE3ICU+JQogIG11dGF0ZShgRHJ1ZyBPZmZlbnNlIFR5cGVgID0gCiAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIlBPU1NFU1MiKSwgIlBvc3Nlc3Npb24iLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiRk9VTkQiKSwgIlBvc3Nlc3Npb24iLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiRElTVFJJQlVURSIpLCAKICAgICAgICAgICAgICAgICAgICAgIlNhbGVzLCBUcmFuc3BvcnRhdGlvbiwgb3IgUHJvZHVjdGlvbiIsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJTTVVHR0xFIiksIAogICAgICAgICAgICAgICAgICAgICAiU2FsZXMsIFRyYW5zcG9ydGF0aW9uLCBvciBQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIlBST0RVQ0UiKSwgCiAgICAgICAgICAgICAgICAgICAgICJTYWxlcywgVHJhbnNwb3J0YXRpb24sIG9yIFByb2R1Y3Rpb24iLAogICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiU0VMTCIpLCAKICAgICAgICAgICAgICAgICAgICAgIlNhbGVzLCBUcmFuc3BvcnRhdGlvbiwgb3IgUHJvZHVjdGlvbiIsCiAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJUUkFGRklDIiksIAogICAgICAgICAgICAgICAgICAgICAiU2FsZXMsIFRyYW5zcG9ydGF0aW9uLCBvciBQcm9kdWN0aW9uIiwKICAgICAgICAgICAgICAiT3RoZXIiKSkpKSkpKSkKICAKCmpvaW5lZF9jb3VudHMgPC0gKHNlYXR0bGVfZHJ1Z3NfMTNfMTcgJT4lIGNvdW50KFllYXIsIGBEcnVnIE9mZmVuc2UgVHlwZWApKSAlPiUKICBsZWZ0X2pvaW4oKFNGX2RydWdzXzEzXzE3ICU+JSBjb3VudChZZWFyLCBgRHJ1ZyBPZmZlbnNlIFR5cGVgKSksIGJ5ID0gYygiWWVhciIsICJEcnVnIE9mZmVuc2UgVHlwZSIpKSAlPiUKICBnYXRoZXIobi54LCBuLnksIGtleSA9IENpdHksIHZhbHVlID0gSW5jaWRlbnRzKSAlPiUKICBtdXRhdGUoQ2l0eSA9IGZjdF9yZWNvZGUoQ2l0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhdHRsZSA9ICJuLngiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBgU2FuIEZyYW5jaXNjb2AgPSAibi55IikpCgojcmVmb3JtYXQgc29tZSBjYXRlZ29yaWVzIHRoYXQgd2lsbCBhcHBlYXIgaW4gdGhlIHBsb3QKam9pbmVkX2NvdW50cyA8LSBqb2luZWRfY291bnRzICU+JSAKICBtdXRhdGUoYERydWcgT2ZmZW5zZSBUeXBlYCA9IGFzLmZhY3RvcihgRHJ1ZyBPZmZlbnNlIFR5cGVgKSkgJT4lCiAgbXV0YXRlKGBEcnVnIE9mZmVuc2UgVHlwZWAgPSAKICAgICAgICAgICBmY3RfcmVjb2RlKGBEcnVnIE9mZmVuc2UgVHlwZWAsCiAgICAgICAgICAgICAgICAgICAgICAiIFNhbGVzLCBUcmFuc3BvcnRhdGlvbixcbm9yIFByb2R1Y3Rpb24iID0gIlNhbGVzLCBUcmFuc3BvcnRhdGlvbiwgb3IgUHJvZHVjdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAiIFBvc3Nlc3Npb24iID0gIlBvc3Nlc3Npb24iKSkKCnBsb3QgPC0gZ2dwbG90KGpvaW5lZF9jb3VudHMgJT4lIGZpbHRlcihgRHJ1ZyBPZmZlbnNlIFR5cGVgICE9ICJPdGhlciIpKSArCiAgZ2VvbV9jb2woYWVzKHggPSBZZWFyLCB5ID0gSW5jaWRlbnRzLCBmaWxsID0gQ2l0eSwgY29sb3IgPSBgRHJ1ZyBPZmZlbnNlIFR5cGVgKSwKICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpKSArCiAgbGFicyh4ID0gInllYXIiLCB5ID0gImNvdW50IiwKICAgICAgIHRpdGxlID0gIkRydWctcmVsYXRlZCBQb2xpY2UgSW5jaWRlbnRzOiBwb3NzZXNzaW9uIHZlcnN1cyB0cmFmZmlja2luZyIpCgpnZ3Bsb3RseShwbG90KSAlPiUgbGF5b3V0KG1hcmdpbiA9IGxpc3QoYiA9IDUwLCBsID0gNjAsIHIgPSAxMCwgdCA9IDgwKSkKYGBgCgoKCgpgYGB7ciwgZmlnLmhlaWdodCA9IDUsIGZpZy53aWR0aCA9IDEwfQpzZWF0dGxlX2RydWdzXzEzXzE3IDwtIHNlYXR0bGVfZHJ1Z3NfMTNfMTcgJT4lCiAgbXV0YXRlKGBEcnVnIFR5cGVgID0gaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJNQVJJSlUiKSwgIk1hcmlqdWFuYSIsICAgICN5ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiTUVUSCIpLCAiTWV0aGFtcGhldGFtaW5lIiwgICAgI3llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJDT0NBSU5FIiksICJDb2NhaW5lIiwgICN5ZXMgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIkhFUk9JTiIpLCAiSGVyb2luIiwgICN5ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiUFJFU0NSSVBUSU9OIiksICJQcmVzY3JpcHRpb24iLCAjPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJQSUxML1RBQkxFVCIpLCAiUGlsbC9UYWJsZXQiLCAgIz8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiSEFMTFVDSU5PR0VOIiksICJIYWxsdWNpbm9nZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJTWU5USEVUSUMiKSwgIlN5bnRoZXRpYyIsICAjPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoYE9mZmVuc2UgVHlwZWAsICJBTVBIRVRBTUlORSIpLCAiQW1waGV0YW1pbmUiLCAjeWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChgT2ZmZW5zZSBUeXBlYCwgIk9QSVVNIiksICJPcGl1bSIsICN5ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KGBPZmZlbnNlIFR5cGVgLCAiUEFSQVBIRU5BTElBIiksICJQYXJhcGhlcm5hbGlhIiwgI3llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIk90aGVyIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKSkpKSkpKSkpCiAgClNGX2RydWdzXzEzXzE3IDwtIFNGX2RydWdzXzEzXzE3ICU+JQogIG11dGF0ZShgRHJ1ZyBUeXBlYCA9IGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiTUFSSUpVQU5BIiksICJNYXJpanVhbmEiLCAgICN5ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiQ09DQUlORSIpLCAiQ29jYWluZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIk1FVEgtQU1QSEVUQU1JTkUiKSwgIk1ldGhhbXBoZXRhbWluZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIkJBUkJJVFVBVEVTIiksICJCYXJiaXR1YXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIkNPTlRST0xMRUQgU1VCU1RBTkNFIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRyb2xsZWQgU3Vic3RhbmNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiSEFMTFVDSU5PR0VOSUMiKSwgIkhhbGx1Y2lub2dlbmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiQU1QSEVUQU1JTkUiKSwgIkFtcGhldGFtaW5lIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIk1FVEhBRE9ORSIpLCAiTWV0aGFkb25lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KERlc2NyaXB0LCAiUEFSQVBIRVJOQUxJQSIpLCAiUGFyYXBoZXJuYWxpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChEZXNjcmlwdCwgIk9QSUFURVMiKSwgIk9waWF0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJPUElVTSIpLCAiT3BpdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoRGVzY3JpcHQsICJIRVJPSU4iKSwgIkhlcm9pbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3RoZXIiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpKSkpKSkpKSkpCgpnZ3Bsb3QoU0ZfZHJ1Z3NfMTNfMTcpICsKICBnZW9tX2JhcihhZXMoYERydWcgVHlwZWApKSArCiAgbGFicyh0aXRsZSA9ICJTYW4gRnJhbmNpc2NvIikgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNzUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkKCnNlYXR0bGVfc2VsZWN0ZWRfZHJ1Z3MgPC0gc2VhdHRsZV9kcnVnc18xM18xNyAlPiUKICBmaWx0ZXIoYERydWcgVHlwZWAgJWluJSBjKCJNYXJpanVhbmEiLCAiQ29jYWluZSIsICJNZXRoYW1waGV0YW1pbmUiLCAiSGVyb2luIikpCgpTRl9zZWxlY3RlZF9kcnVncyA8LSBTRl9kcnVnc18xM18xNyAlPiUKICBmaWx0ZXIoYERydWcgVHlwZWAgJWluJSBjKCJNYXJpanVhbmEiLCAiQ29jYWluZSIsICJNZXRoYW1waGV0YW1pbmUiLCAiSGVyb2luIikpCgpnZ3Bsb3Qoc2VhdHRsZV9zZWxlY3RlZF9kcnVncykgKwogIGdlb21fYmFyKGFlcyhgRHJ1ZyBUeXBlYCkpICsKICBsYWJzKHRpdGxlID0gIlNlYXR0bGUiKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKQoKZ2dwbG90KFNGX3NlbGVjdGVkX2RydWdzKSArCiAgZ2VvbV9iYXIoYWVzKGBEcnVnIFR5cGVgKSkgKwogIGxhYnModGl0bGUgPSAiU2FuIEZyYW5jaXNjbyIpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDc1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpCgpqb2luZWRfZHJ1Z19jb3VudHMgPC0gKHNlYXR0bGVfc2VsZWN0ZWRfZHJ1Z3MgJT4lIGNvdW50KFllYXIsIGBEcnVnIFR5cGVgKSkgJT4lCiAgbGVmdF9qb2luKChTRl9zZWxlY3RlZF9kcnVncyAlPiUgY291bnQoWWVhciwgYERydWcgVHlwZWApKSwgYnkgPSBjKCJZZWFyIiwgIkRydWcgVHlwZSIpKQogIApqb2luZWRfZHJ1Z19jb3VudHMgPC0gam9pbmVkX2RydWdfY291bnRzICU+JQogIHJlbmFtZShTZWF0dGxlID0gbi54LCBgU2FuIEZyYW5jaXNjb2AgPSBuLnkpICU+JQogIGdhdGhlcihTZWF0dGxlLCBgU2FuIEZyYW5jaXNjb2AsIGtleSA9IENpdHksIHZhbHVlID0gY291bnQpCiAgCnBsdCA8LSBnZ3Bsb3Qoam9pbmVkX2RydWdfY291bnRzKSArIGdlb21fY29sKGFlcyh4ID0gWWVhciwgeSA9IGNvdW50LCBmaWxsID0gQ2l0eSwgY29sb3IgPSBgRHJ1ZyBUeXBlYCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gImRvZGdlIikKCmdncGxvdGx5KHBsdCkgJT4lIGxheW91dChtYXJnaW4gPSBsaXN0KGIgPSA1MCwgbCA9IDYwLCByID0gMTAsIHQgPSA4MCkpCgoKYGBgCgoKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMywgZmlnLndpZHRoID0gNH0KbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoZ3JpZEV4dHJhKQoKI2ZpZy5oZWlnaHQgPSAyLCBmaWcud2lkdGggPSAzCgojc2VhdHRsZV9kcnVnc18xM18xNyA8LSBzZWF0dGxlX2RydWdzXzEzXzE3ICU+JQojICBtdXRhdGUoUl9kYXRlID0gZmxvb3JfZGF0ZShtZHlfaG1zKGBPY2N1cnJlZCBEYXRlIG9yIERhdGUgUmFuZ2UgU3RhcnRgLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR6ID0gIlBTVDhQRFQiKSwgImRheSIpKQoKI1NGX2RydWdzXzEzXzE3IDwtIFNGX2RydWdzXzEzXzE3ICU+JQojICBtdXRhdGUoUl9kYXRlID0gbWR5KERhdGUsIHR6ID0gIlBTVDhQRFQiKSkKCnNlYXR0bGVfc2VsZWN0ZWRfZHJ1Z3MgPC0gc2VhdHRsZV9kcnVnc18xM18xNyAlPiUKICBmaWx0ZXIoYERydWcgVHlwZWAgJWluJSBjKCJNYXJpanVhbmEiLCAiQ29jYWluZSIsICJNZXRoYW1waGV0YW1pbmUiLCAiSGVyb2luIikpCgpTRl9zZWxlY3RlZF9kcnVncyA8LSBTRl9kcnVnc18xM18xNyAlPiUKICBmaWx0ZXIoYERydWcgVHlwZWAgJWluJSBjKCJNYXJpanVhbmEiLCAiQ29jYWluZSIsICJNZXRoYW1waGV0YW1pbmUiLCAiSGVyb2luIikpCgpudW1iZXJfb2ZfYmlucyA8LSA3OAoKcGx0X3NlYXR0bGVfc2VsZWN0ZWRfZHJ1Z3MgPC0gZ2dwbG90KHNlYXR0bGVfc2VsZWN0ZWRfZHJ1Z3MpICsgCiAgZ2VvbV9mcmVxcG9seShhZXMoeCA9IFJfZGF0ZSwgY29sb3IgPSBgRHJ1ZyBUeXBlYCksIGJpbnMgPSBudW1iZXJfb2ZfYmlucykgKwogIHNjYWxlX3hfZGF0ZXRpbWUoZGF0ZV9icmVha3MgPSAiNCBtb250aHMiLCAKICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoYXMuUE9TSVhjdCgiMjAxMi8xMi8zMSIsIHR6ID0gIlBTVDhQRFQiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLlBPU0lYY3QoIjIwMTgvMDEvMDEiLCB0eiA9ICJQU1Q4UERUIikpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh5ID0gIm51bWJlciBwZXIgZm9ydG5pZ2h0IiwgeCA9ICIiLAogICAgICAgdGl0bGUgPSAiU2VhdHRsZSBQb2xpY2UgSW5jaWRlbnRzIFJlbGF0ZWQgdG8gNCBQb3B1bGFyIERydWdzIiwKICAgICAgIGNvbG9yID0gIkRydWc6ICIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gNiksCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSkgKwogIGd1aWRlcyhzaXplID0gZ3VpZGVfbGVnZW5kKG9yZGVyID0gMikpCgpwbHRfU0Zfc2VsZWN0ZWRfZHJ1Z3MgPC0gZ2dwbG90KFNGX3NlbGVjdGVkX2RydWdzKSArCiAgZ2VvbV9mcmVxcG9seShhZXMoeCA9IFJfZGF0ZSwgY29sb3IgPSBgRHJ1ZyBUeXBlYCksIGJpbnMgPSBudW1iZXJfb2ZfYmlucykgKwogIHNjYWxlX3hfZGF0ZXRpbWUoZGF0ZV9icmVha3MgPSAiNCBtb250aHMiLCAKICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoYXMuUE9TSVhjdCgiMjAxMi8xMi8zMSIsIHR6ID0gIlBTVDhQRFQiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLlBPU0lYY3QoIjIwMTgvMDEvMDEiLCB0eiA9ICJQU1Q4UERUIikpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh5ID0gIm51bWJlciBwZXIgZm9ydG5pZ2h0IiwgeCA9ICIiLAogICAgICAgdGl0bGUgPSAiU2FuIEZyYW5jaXNjbyBQb2xpY2UgSW5jaWRlbnRzIFJlbGF0ZWQgdG8gNCBQb3B1bGFyIERydWdzIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkKCnBsdF9zZWF0dGxlX2FsbF8xM18xNyA8LSBzZWF0dGxlX2NvbXBsZXRlICU+JSAKICBmaWx0ZXIoWWVhciAlaW4lIDIwMTM6MjAxNykgJT4lCiAgZ2dwbG90KGFlcyh4ID0gUl9kYXRlKSkgKyBnZW9tX2ZyZXFwb2x5KGJpbnMgPSBudW1iZXJfb2ZfYmlucykgKwogIHNjYWxlX3hfZGF0ZXRpbWUoZGF0ZV9icmVha3MgPSAiNCBtb250aHMiLCAKICAgICAgICAgICAgICAgICAgIGxpbWl0cyA9IGMoYXMuUE9TSVhjdCgiMjAxMi8xMi8zMSIsIHR6ID0gIlBTVDhQRFQiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzLlBPU0lYY3QoIjIwMTgvMDEvMDEiLCB0eiA9ICJQU1Q4UERUIikpKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh5ID0gIm51bWJlciBwZXIgZm9ydG5pZ2h0IiwgeCA9ICIiLAogICAgICAgdGl0bGUgPSAiU2VhdHRsZSBQb2xpY2UgSW5jaWRlbnRzOiAyMDEzIHRocm91Z2ggMjAxNyIpICsKICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSwKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA2KSkKCnBsdF9TRl9hbGxfMTNfMTcgPC0gU0ZfY29tcGxldGUgJT4lCiAgZmlsdGVyKFllYXIgJWluJSAyMDEzOjIwMTcpICU+JQogIGdncGxvdChhZXMoeCA9IFJfZGF0ZSkpICsgZ2VvbV9mcmVxcG9seShiaW5zID0gbnVtYmVyX29mX2JpbnMpICsKICBzY2FsZV94X2RhdGV0aW1lKGRhdGVfYnJlYWtzID0gIjQgbW9udGhzIiwgCiAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKGFzLlBPU0lYY3QoIjIwMTIvMTIvMzEiLCB0eiA9ICJQU1Q4UERUIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcy5QT1NJWGN0KCIyMDE4LzAxLzAxIiwgdHogPSAiUFNUOFBEVCIpKSkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnMoeSA9ICJudW1iZXIgcGVyIGZvcnRuaWdodCIsIHggPSAiIiwKICAgICAgIHRpdGxlID0gIlNhbiBGcmFuY2lzY28gUG9saWNlIEluY2lkZW50czogMjAxMyB0aHJvdWdoIDIwMTciKSArCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gOSksCiAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNikpCgpncmlkLmFycmFuZ2UocGx0X3NlYXR0bGVfYWxsXzEzXzE3LCBwbHRfU0ZfYWxsXzEzXzE3LCAKICAgICAgICAgICAgIHBsdF9TRl9zZWxlY3RlZF9kcnVncywgcGx0X3NlYXR0bGVfc2VsZWN0ZWRfZHJ1Z3MsICAKICAgICAgICAgICAgIGxheW91dF9tYXRyaXggPSByYmluZChjKDEsIDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoNCwgMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyg0LCBOQSkpLAogICAgICAgICAgICAgaGVpZ2h0cyA9IGMoNSwgNSwgMSkpCiAgICAgICAgICAgICAKYGBgCgoKCgoK